/*
 * TestHash.cpp
 *
 *  Created on: 29/10/2009
 *      Author: hernan
 */

#include "../Model/ArchivoTexto.h"
#include "../Model/ArchivoBinario.h"
#include "../Strategies/Storage/TablaEspacioLibre.h"
#include "../Strategies/Resource/ResourceStrategy.h"
#include "../Model/ArchivoTexto.h"
#include "math.h"
#include <list>
#include "../Hash/Tabladirecciones.h"
#include "../Externa/Clave.h"
#include "../Model/Bloque.h"
#include "../Model/Registro.h"
#include "../Model/BloqueHashDisco.h"
#include "../Model/StorageResource.h"
#include "../Strategies/Storage/BlockStorageStrategy.h"
#include "../Hash/TablaTamanioDisp.h"
#include "../Externa/Dato.h"
#include <vector>
#include <sstream>
#include "Alumno.h"
#include "../StorageResourceFactory.h"

using namespace std;


class TestHash {

public:

	Alumno *alum;

	StorageResourceFactory *storageResourceFactory;

	StorageResource *storageResource;

public:

	void Setup () {

		string nombre = "archivo111.txt";

		storageResourceFactory = new StorageResourceFactory();
		 storageResourceFactory->createStorageBlockResourceIndexedByExtensibleHashDeferredWriting(120,nombre);
	    storageResource = storageResourceFactory->getStorageResource();

	}
	void Insercion()
	{
		 cout << "PRUEBA HASH: INSERCION" << endl;

		 storageResource->setData(new Alumno());

		 alum=static_cast<Alumno*>(storageResource->getDato());

	     string s = "123456789";

	     alum->setDni(s);

    	 Clave clave("",storageResource->getDato());

    	 storageResource->setClave(&clave);

    	 cout << "PRUEBA HASH: SE PROCEDE A GRABAR DATO" << endl;

    	 storageResource->saveData();

	    return;
	}

	void InsercionLista(){

		list <Dato*> alumnos;
		list<Dato*>::iterator iterator;

		Alumno *alumno = new Alumno();
	    alumno->setDni("1111111");
	    alumnos.insert(alumnos.end(),alumno);

	    Alumno *alumno2 = new Alumno();
		alumno2->setDni("22222222");
		alumnos.insert(alumnos.end(),alumno2);

	    Alumno *alumno3 = new Alumno();
		alumno3->setDni("33333333");
		alumnos.insert(alumnos.end(),alumno3);

	    Alumno *alumno4 = new Alumno();
		alumno4->setDni("444444444");
		alumnos.insert(alumnos.end(),alumno4);

	    Alumno *alumno5 = new Alumno();
		alumno5->setDni("555555555");
		alumnos.insert(alumnos.end(),alumno5);

	    Alumno *alumno6 = new Alumno();
		alumno6->setDni("666666666");
		alumnos.insert(alumnos.end(),alumno6);

	    Alumno *alumno7 = new Alumno();
		alumno7->setDni("777777777");
		alumnos.insert(alumnos.end(),alumno7);

	    Alumno *alumno8 = new Alumno();
		alumno8->setDni("888888888");
		alumnos.insert(alumnos.end(),alumno8);

		cout << "ULTIMA INSERCION:" << endl;

	    Alumno *alumno9 = new Alumno();
		alumno9->setDni("9999999999");
		alumnos.insert(alumnos.end(),alumno9);


		storageResource->setData(alumnos);
		storageResource->saveData();

		cout << "SE INSERTO LISTA " << endl;

	}

	void Eliminacion()
	{
		string s= "1111111";

		storageResource->setData(new Alumno());

		alum=static_cast<Alumno*>(storageResource->getDato());
		alum->setDni(s);

		Clave clave("",storageResource->getDato());

		storageResource->setClave(&clave);

		storageResource->deleteData(&clave);

	}


	void GetData() {

		string s= "123456789";

		storageResource->setData(new Alumno());

		alum=static_cast<Alumno*>(storageResource->getDato());

		alum->setDni(s);

		Clave clave("",storageResource->getDato());
		storageResource->setClave(&clave);

		alum = static_cast<Alumno*> (storageResource->getData(&clave));

		cout << "Apellido del dato obtenido: " << alum->getApellido() << endl;



	}

	void UpdateData(){

		string s= "123456789";

		storageResource->setData(new Alumno());

		alum=static_cast<Alumno*>(storageResource->getDato());


		alum->setDni(s);
		alum->setApellido("Nuevo Apellido");

		Clave clave("",storageResource->getDato());
		storageResource->setClave(&clave);


		storageResource->updateData(storageResource->getDato(),&clave);


	}

	void Terminar () {
		delete storageResourceFactory;

		cout << "El test de TestHash se completo"<< endl;
	}

	void Run() {
		Setup();
		Insercion();
		InsercionLista();
		UpdateData();
		Eliminacion();
		GetData();
		Terminar();
	}


};


